D) thread.hpp

#include <iostream>
#include <thread>
using std::thread;
void func1(void){
for(int i=0; i<10; ++i){
std::cout<<"THREAD 1\n";
}
}
void func2(void){
for(int i=0; i<10; ++i){
std::cout<<"THREAD 2\n";
}
}
void func3(void){
for(int i=0; i<10; ++i){
std::cout<<"THREAD 3\n";
}
}
int main(void){
thread t1(func1);
thread t2(func2);
thread t3(func3);
t1.detach();
t2.detach();
t3.detach();
std::cout<<"END MAIN\n";
return 0;
}
thread를 detach한 이후, main함수는 더이상 쓰레드가 종료될 때까지 기다리지 않 음
프로세스가 종료될 때, 해당 프로세스 안에 잇는 모든 쓰레드의 종료 여부와 상관없이 종료됨
#include <cstdio>
#include <iostream>
#include <thread>
#include <vector>
using std::thread;
using std::vector;
void worker(vector<int>::iterator start, vector<int>::iterator end, int* result){
int sum=0;
for(auto itr=start; itr<end; ++itr){
sum+=*itr;
}
*result=sum;
thread::id this_id=std::this_thread::get_id();
printf(" %x %d %d : %d\n", this_id, *start, *(end-1), sum);
}
int main(void){
vector<int> data(10000);
for(int i=0; i<10000; ++i){
data[i]=i;
}
vector<int> partial_sums(4);
vector<thread>workers;
for(int i=0; i<4; ++i){
workers.push_back(thread(worker, data.begin()+i*2500, data.begin()+(i+1)*2500, &partial_sums[i]));
}
for(int i=0; i<4; ++i){
workers[i].join();
}
int total=0;
for(int i=0; i<4; ++i){
total+=partial_sums[i];
}
std::cout<<"TOTAL SUM: "<<total<<std::endl;
return 0;
}

쓰레드 6f3cf000 에서 0부터 2499까지 계산한 결과: 3123750

쓰레드 6f4e7000 에서 5000부터 7499까지 계산한 결과: 15623750

쓰레드 6f573000 에서 7500부터 9999까지 계산한 결과: 21873750

쓰레드 6f45b000 에서 2500부터 4999까지 계산한 결과: 9373750

TOTAL SUM: 49995000

쓰레드는 리턴값이 없기 때문에 포인터를 이용해서 결과값을 저장해야 함